package gitbucket.core

import java.net.InetSocketAddress
import java.nio.file.Files
import java.io.File

import gitbucket.core.util.{FileUtil, HttpClientUtil}
import org.apache.http.client.methods.HttpGet
import org.eclipse.jetty.server.handler.StatisticsHandler
import org.eclipse.jetty.server.{Handler, Server}
import org.eclipse.jetty.webapp.WebAppContext
import org.kohsuke.github.GitHub

class TestingGitBucketServer(val port: Int = 19999) extends AutoCloseable {
    private var server: Server = null
    private var dir: File = null

    start()

    private def start(): Unit = {
        System.setProperty("java.awt.headless", "true")

        dir = Files.createTempDirectory("gitbucket-test-").toFile
        System.setProperty("gitbucket.home", dir.getAbsolutePath)

        val address = new InetSocketAddress(port)
        server = new Server(address)

        val context = new WebAppContext
        context.setResourceBase("./target/webapp")
        context.setContextPath("")
        context.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false")
        context.setServer(server)

        val handler = addStatisticsHandler(context)
        server.setHandler(handler)

        server.start()

        HttpClientUtil.withHttpClient(None) { httpClient =>
            var launched = false
            var count = 0
            while (!launched && count < 10) {
                Thread.sleep(500)
                val res = httpClient.execute(new HttpGet(s"http://localhost:${port}/"))
                launched = res.getStatusLine.getStatusCode == 200
                count += 1
            }
        }
    }

    def client(login: String, password: String): GitHub = GitHub
        .connectToEnterprise(s"http://localhost:${port}/api/v3", login, password)

    def getDirectory(): File = dir

    private def addStatisticsHandler(handler: Handler) = { // The graceful shutdown is implemented via the statistics handler.
        // See the following: https://bugs.eclipse.org/bugs/show_bug.cgi?id=420142
        val statisticsHandler = new StatisticsHandler
        statisticsHandler.setHandler(handler)
        statisticsHandler
    }

    def close(): Unit = {
        server.stop()
        FileUtil.deleteIfExists(dir)
    }
}
